#include <Wire.h>
#define GW_GRAY_ADDR 0x4C  // 传感器I2C地址 

void pingSensor() { //这是一个颜色传感器和arduino是否正常配对
（启动顺序可能导致一些差错）的检验
  uint8_t sensorStatus;
  unsigned long startTime = millis();
  do {
    Wire.beginTransmission(GW_GRAY_ADDR);// 地址
    Wire.write(0xAA);// 握手
    Wire.endTransmission(0);//结束当前I2C传输，但不发送停止条件（参数0表示保持总线连接） 只是一轮测试
    Wire.requestFrom(GW_GRAY_ADDR, 1, 1);//主设备向从设备请求1字节数据，读取后自动释放总线（最后一个1）
    if(Wire.available()) {
      sensorStatus = Wire.read();
    }
    delay(10);
    
    // 添加超时（5秒）
    if(millis() - startTime > 5000) {
      Serial.println("Ping timeout!");
      return;
    }
  } while (sensorStatus != 0x66);//当颜色传感器初始化完成后，收到了 0xAA 命令，它会理解为 ping 命令，这时如果它在线，它会返回0x66。
}

void setup() {
  Serial.begin(115200);
  Wire.begin();



  Serial.println("Sensor initialized");

  // 1. 传感器握手
  pingSensor();
  
  // 2. 发送启动测量命令
  Wire.beginTransmission(GW_GRAY_ADDR);
  Wire.write(0xD0);        // 启动测量命令
  Wire.endTransmission(1); // 产生停止条件
  
  Serial.println("Sensor initialized");
}

void loop() {
  uint8_t recv_value[24]; // 存储8组RGB数据(3字节/组 × 8组)
  
  // 请求读取24字节数据
  Wire.requestFrom(GW_GRAY_ADDR, 24, 1);
  
  // 读取并解析数据
  for (int i = 0; i < 24; i++) {
    if (Wire.available()) {
      recv_value[i] = Wire.read();
    }
  }
  
  // 打印第一组RGB值（recv_value[0-2]）
  Serial.print("R:");
  Serial.print(recv_value[0]);
  Serial.print(" G:");
  Serial.print(recv_value[1]);
  Serial.print(" B:");
  Serial.println(recv_value[2]);
  
  delay(500); // 适当延迟
}